/**
 * Copyright(c) 2013 Jade Techonologies Co., Ltd.
 *
 * History:
 *   13-4-28 下午1:43 Created by dwzhang
 */
package com.jade.framework.startup.def;

import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.springframework.util.CollectionUtils;

/**
 * <server>的定义。
 *
 * @author dwzhang
 * @version 1.0 13-4-28 下午1:43
 */
public class ServerDefinition
{
    private String type;
    private int port;
    private List<ConfigDefinition> configs;
    //private List<ClasspathDefinition> classpaths;
    //private List<ConnectionDefinition> connections;
    private List<URL> runList;
    private List<URL> configList;


    /**
     * 返回服务器类型
     *
     * @return 服务器类型
     */
    public String getType()
    {
        return type;
    }

    /**
     * 返回服务端口
     *
     * @return 服务端口
     */
    public int getPort()
    {
        return port;
    }

    //    /**
    //     * 返回所有的类路径信息
    //     *
    //     * @return 类路径
    //     */
    //    public ClasspathDefinition[] getClasspaths()
    //    {
    //        if (classpaths != null) {
    //            ClasspathDefinition[] defs = new ClasspathDefinition[classpaths.size()];
    //            classpaths.toArray(defs);
    //            return defs;
    //        }
    //        else {
    //            return new ClasspathDefinition[0];
    //        }
    //    }
    //
    //    /**
    //     * 添加Classpath
    //     *
    //     * @param classpath
    //     */
    //    public void addClasspath(ClasspathDefinition classpath)
    //            throws IOException
    //    {
    //        if (classpath == null) {
    //            throw new IllegalArgumentException("Null classpath definition");
    //        }
    //        if (classpaths == null) {
    //            classpaths = new ArrayList<ClasspathDefinition>(4);
    //        }
    //
    //        // 如果采用了目录的定义方式，则需要把目录下面所有的JAR/ZIP文件装载进来
    //        if (StringUtil.isInvalid(classpath.getFile())) {
    //            File dir = new File(classpath.getDir());
    //            File[] subFiles = dir.listFiles();
    //            for (File subFile : subFiles) {
    //                String filename = subFile.getName();
    //                if (subFile.isFile() && (filename.endsWith(".jar") || filename.endsWith("*.zip"))) {
    //                    ClasspathDef cd = new ClasspathDef();
    //                    cd.setFile(subFile.getPath());
    //                    classpaths.add(cd);
    //                }
    //            }
    //        }
    //        else {
    //            classpaths.add(classpath);
    //            URL[] runs = classpath.getRunList();
    //            if (runList == null) {
    //                runList = new ArrayList<URL>(4);
    //            }
    //            ArrayUtil.addAll(runList, runs);
    //        }
    //    }

    /**
     * 返回配置
     *
     * @return 所有配置定义
     */
    public ConfigDefinition[] getConfigs()
    {
        if (configs != null) {
            ConfigDefinition[] defs = new ConfigDefinition[configs.size()];
            configs.toArray(defs);
            return defs;
        }
        else {
            return new ConfigDefinition[0];
        }
    }

    /** 添加配置 */
    public void addConfig(ConfigDefinition config)
    {
        if (config == null) {
            throw new IllegalArgumentException("Null config definition");
        }
        if (configs == null) {
            configs = new ArrayList<ConfigDefinition>(4);
        }
        configs.add(config);
        URL url = config.getUrl();
        if (url.getFile().endsWith(".xml")) {
            if (runList == null) {
                runList = new ArrayList<URL>(4);
            }
            runList.add(url);
        }
        else if (url.getFile().endsWith(".conf") || url.getFile().endsWith(".properties")) {
            if (configList == null) {
                configList = new ArrayList<URL>();
            }
            configList.add(url);
        }
    }

    //    /**
    //     * 返回所有连接
    //     *
    //     * @return 所有的连接
    //     */
    //    public ConnectionDefinition[] getConnections()
    //    {
    //        if (connections != null) {
    //            ConnectionDefinition[] defs = new ConnectionDefinition[connections.size()];
    //            connections.toArray(defs);
    //            return defs;
    //        }
    //        else {
    //            return new ConnectionDefinition[0];
    //        }
    //    }
    //
    //    /**
    //     * 添加连接
    //     *
    //     * @param connection 连接定义
    //     */
    //    public void addConnection(ConnectionDefinition connection)
    //    {
    //        if (connections == null) {
    //            connections = new ArrayList<ConnectionDefinition>(4);
    //        }
    //        connections.add(connection);
    //    }

    /**
     * 返回所有运行列表，包括jar文件中的
     *
     * @return 所有运行列表
     */
    public URL[] getRunList()
    {
        if (runList != null) {
            URL[] urls = new URL[runList.size()];
            runList.toArray(urls);
            return urls;
        }
        else {
            return new URL[0];
        }
    }


    /**
     * 返回所有注入列表
     *
     * @return 所有注入列表
     */
    public URL[] getConfigList()
    {
        if (configList != null) {
            URL[] urls = new URL[configList.size()];
            configList.toArray(urls);
            return urls;
        }
        else {
            return new URL[0];
        }
    }

    //    /** 判断是否没有任何特殊的根据主机不同的特殊配置 */
    //    public boolean hasSpecialConfig()
    //    {
    //        return port != 0 || connections != null || classpaths != null || configs != null || runList != null;
    //    }

    /**
     * 从服务器定义中扩展
     *
     * @param server 服务器定义
     */
    public void extend(ServerDefinition server)
    {
        if (port == 0) {
            setPort(server.getPort());
        }
        //        //Connections
        //        ConnectionDefinition[] conns = server.getConnections();
        //        if (conns.length > 0) {
        //            ArrayList<ConnectionDefinition> list = new ArrayList<ConnectionDefinition>(
        //                    conns.length + (connections != null ? connections.size() : 0));
        //            ArrayUtil.addAll(list, conns);
        //            if (connections != null) {
        //                list.addAll(connections);
        //            }
        //            connections = list;
        //        }

        //Configs
        ConfigDefinition[] confDefs = server.getConfigs();
        if (confDefs.length > 0) {
            if (configs == null) {
                configs = new ArrayList<ConfigDefinition>();
            }
            CollectionUtils.mergeArrayIntoCollection(confDefs, configs);
        }

        //        //Classpaths
        //        ClasspathDefinition[] cp = server.getClasspaths();
        //        if (cp.length > 0) {
        //            ArrayList<ClasspathDefinition> list = new ArrayList<ClasspathDefinition>(
        //                    cp.length + (classpaths != null ? classpaths.size() : 0));
        //            ArrayUtil.addAll(list, cp);
        //            if (classpaths != null) {
        //                list.addAll(classpaths);
        //            }
        //            classpaths = list;
        //        }

        //Run List
        URL[] urls = server.getRunList();
        if (urls.length > 0) {
            if (runList == null) {
                runList = new ArrayList<URL>();
            }
            CollectionUtils.mergeArrayIntoCollection(urls, runList);
        }

        URL[] configs = server.getConfigList();
        if (configs.length > 0) {
            if (configList == null) {
                configList = new ArrayList<URL>();
            }
            CollectionUtils.mergeArrayIntoCollection(configs, configList);
        }
    }

    /**
     * 设置服务器类型
     *
     * @param type 类型
     */
    public void setType(String type)
    {
        this.type = type;
    }

    /**
     * 　设置端口
     *
     * @param port 服务器端口
     */
    public void setPort(int port)
    {
        this.port = port;
    }
}
